package rpcserver

import (
	"fmt"
	"gitee.com/scottq/go-framework/src/v1/log"
	"google.golang.org/grpc"
	"net"
)

type GRPCRegServerFunc = func(*grpc.Server)

type GRPCServer struct {
	name       string
	listenAdd  string
	s          *grpc.Server
	rpcRegFunc GRPCRegServerFunc

	srRegisterWay string

	log.InvokeLog
}

func NewGRPCServer(name string, addr string, regFunc GRPCRegServerFunc) (*GRPCServer, error) {
	server := &GRPCServer{
		name:       name,
		listenAdd:  addr,
		rpcRegFunc: regFunc,
	}

	return server, nil
}

func (server *GRPCServer) Run() error {
	return server.run()
}

func (server *GRPCServer) run() error {
	lis, err := net.Listen("tcp", server.listenAdd)
	if err != nil {
		server.Fatal("rpc running at %s", server.listenAdd)
	}
	s := grpc.NewServer()
	if server.rpcRegFunc != nil {
		server.rpcRegFunc(s)
	}

	fmt.Printf("[%s]rpc running at %s\n", server.name, server.listenAdd)
	if err := s.Serve(lis); err != nil {
		server.Fatal("failed to serve: %v", err)
		return err
	}

	return nil
}

func (server *GRPCServer) Name() string {
	return server.name
}

func (server *GRPCServer) Stop() error {
	if server.s == nil {
		return nil
	}
	server.Info("[%s]rpc stop %s", server.name, server.listenAdd)

	server.s.Stop()
	return nil
}

//注册发现
//func (s *GRPCServer) registerDiscovery() error {
//	var err error
//	switch s.srRegisterWay {
//	case "etcd":
//		etcdAddr := ""
//		rpcAddr := s.listenAdd
//		if etcdAddr == "" {
//			return fmt.Errorf("sr register addr is empty")
//		}
//		if rpcAddr == "" {
//			rpcAddr, err = utils.GetLocalIP()
//			if err != nil {
//				return err
//			}
//		}
//		sr := etcdv3.RegisterService(
//			etcdAddr,
//			s.AppName,
//			rpcAddr+":"+s.RpcPort, 5)
//		go sr.ListenLease()
//		//defer sr.Close()
//	default:
//	}
//	return nil
//}
